package cn.flying.cloud.esb.core.chain;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 默认的处理器链实现类
 *
 * @author: admin
 * @date: 2025年01月16日 17:01
 * @version: 1.0
 */
public class DefaultHandlerChain implements HandlerChain {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private final List<Handler> handlers = new ArrayList<>();
    private int index = 0;
    private ExceptionHandler exceptionHandler;

    /**
     * 添加处理器
     *
     * @param handler
     * @return
     */
    public DefaultHandlerChain addHandler(Handler handler) {
        if (handler != null) {
            handlers.add(handler);
        }
        return this;
    }

    /**
     * 添加异常处理器
     *
     * @param exceptionHandler 异常处理器
     * @return
     */
    public DefaultHandlerChain onException(ExceptionHandler exceptionHandler) {
        this.exceptionHandler = exceptionHandler;
        return this;
    }

    /**
     * @param ctx 上下文对象
     */
    @Override
    public void execute(ChainContext<?> ctx) {
        if (index < handlers.size()) {
            Handler handler = handlers.get(index++);
            try {
                handler.execute(ctx, this);
            } catch (Exception e) {
                // 如果出现异常，直接将索引值设置为最大，即不再执行异常之后的handler
                index = handlers.size();
                logger.warn("执行链出现异常，后续的handler将被终止执行！");
                handleException(ctx, e);
            }
        }
    }

    /**
     * 异常处理方法
     *
     * @param ctx       上下文对象
     * @param exception 捕获到的异常
     */
    private void handleException(ChainContext<?> ctx, Exception exception) {
        // 可以根据具体需求进行异常处理，例如记录日志、返回错误信息等，这里就直接调用对应的异常处理器
        this.exceptionHandler.handleException(ctx, exception);
    }
}
